home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / TRANS.FRM < prev    next >
Text File  |  1996-05-02  |  22KB  |  761 lines

  1. VERSION 4.00
  2. Begin VB.Form TransformedForm 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Surfaces of Transformation"
  6.    ClientHeight    =   5700
  7.    ClientLeft      =   690
  8.    ClientTop       =   900
  9.    ClientWidth     =   7830
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   1
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   6390
  21.    KeyPreview      =   -1  'True
  22.    Left            =   630
  23.    LinkTopic       =   "Form1"
  24.    ScaleHeight     =   380
  25.    ScaleMode       =   3  'Pixel
  26.    ScaleWidth      =   522
  27.    Top             =   270
  28.    Width           =   7950
  29.    Begin VB.CommandButton CmdCreate 
  30.       Caption         =   "Transform"
  31.       Height          =   495
  32.       Left            =   600
  33.       TabIndex        =   19
  34.       Top             =   5040
  35.       Width           =   1095
  36.    End
  37.    Begin VB.Frame Frame1 
  38.       Caption         =   "Transformations"
  39.       Height          =   2055
  40.       Left            =   0
  41.       TabIndex        =   14
  42.       Top             =   2880
  43.       Width           =   2295
  44.       Begin VB.OptionButton TransChoice 
  45.          Caption         =   "Wierd"
  46.          Height          =   255
  47.          Index           =   4
  48.          Left            =   120
  49.          TabIndex        =   22
  50.          Top             =   1680
  51.          Width           =   2055
  52.       End
  53.       Begin VB.OptionButton TransChoice 
  54.          Caption         =   "Up, Shrink/Grow"
  55.          Height          =   255
  56.          Index           =   3
  57.          Left            =   120
  58.          TabIndex        =   18
  59.          Top             =   1320
  60.          Width           =   2055
  61.       End
  62.       Begin VB.OptionButton TransChoice 
  63.          Caption         =   "Up, Shrink, Twist"
  64.          Height          =   255
  65.          Index           =   2
  66.          Left            =   120
  67.          TabIndex        =   17
  68.          Top             =   960
  69.          Width           =   2055
  70.       End
  71.       Begin VB.OptionButton TransChoice 
  72.          Caption         =   "Up, Shrink"
  73.          Height          =   255
  74.          Index           =   1
  75.          Left            =   120
  76.          TabIndex        =   16
  77.          Top             =   600
  78.          Width           =   2055
  79.       End
  80.       Begin VB.OptionButton TransChoice 
  81.          Caption         =   "Up, Twist"
  82.          Height          =   255
  83.          Index           =   0
  84.          Left            =   120
  85.          TabIndex        =   15
  86.          Top             =   240
  87.          Value           =   -1  'True
  88.          Width           =   2055
  89.       End
  90.    End
  91.    Begin VB.Frame Frame2 
  92.       Caption         =   "Curve"
  93.       Height          =   2775
  94.       Left            =   0
  95.       TabIndex        =   8
  96.       Top             =   0
  97.       Width           =   2295
  98.       Begin VB.OptionButton CurveChoice 
  99.          Caption         =   "Semicircle"
  100.          Height          =   255
  101.          Index           =   6
  102.          Left            =   120
  103.          TabIndex        =   21
  104.          Top             =   2400
  105.          Width           =   2055
  106.       End
  107.       Begin VB.OptionButton CurveChoice 
  108.          Caption         =   "Line Segment"
  109.          Height          =   255
  110.          Index           =   0
  111.          Left            =   120
  112.          TabIndex        =   20
  113.          Top             =   240
  114.          Value           =   -1  'True
  115.          Width           =   2055
  116.       End
  117.       Begin VB.OptionButton CurveChoice 
  118.          Caption         =   "Star"
  119.          Height          =   255
  120.          Index           =   5
  121.          Left            =   120
  122.          TabIndex        =   13
  123.          Top             =   2040
  124.          Width           =   2055
  125.       End
  126.       Begin VB.OptionButton CurveChoice 
  127.          Caption         =   "Off Center Circle"
  128.          Height          =   255
  129.          Index           =   4
  130.          Left            =   120
  131.          TabIndex        =   12
  132.          Top             =   1680
  133.          Width           =   2055
  134.       End
  135.       Begin VB.OptionButton CurveChoice 
  136.          Caption         =   "Circle"
  137.          Height          =   255
  138.          Index           =   3
  139.          Left            =   120
  140.          TabIndex        =   11
  141.          Top             =   1320
  142.          Width           =   2055
  143.       End
  144.       Begin VB.OptionButton CurveChoice 
  145.          Caption         =   "Off Center Square"
  146.          Height          =   255
  147.          Index           =   2
  148.          Left            =   120
  149.          TabIndex        =   10
  150.          Top             =   960
  151.          Width           =   2055
  152.       End
  153.       Begin VB.OptionButton CurveChoice 
  154.          Caption         =   "Square"
  155.          Height          =   255
  156.          Index           =   1
  157.          Left            =   120
  158.          TabIndex        =   9
  159.          Top             =   600
  160.          Width           =   2055
  161.       End
  162.    End
  163.    Begin VB.CheckBox ShowAxesCheck 
  164.       Caption         =   "Show Axes"
  165.       Height          =   255
  166.       Left            =   2400
  167.       TabIndex        =   7
  168.       Top             =   5400
  169.       Width           =   1335
  170.    End
  171.    Begin VB.TextBox PhiText 
  172.       Height          =   285
  173.       Left            =   6960
  174.       TabIndex        =   6
  175.       Text            =   "0.1570"
  176.       Top             =   5400
  177.       Width           =   855
  178.    End
  179.    Begin VB.TextBox ThetaText 
  180.       Height          =   285
  181.       Left            =   5640
  182.       TabIndex        =   4
  183.       Text            =   "0.6283"
  184.       Top             =   5400
  185.       Width           =   855
  186.    End
  187.    Begin VB.TextBox RText 
  188.       Height          =   285
  189.       Left            =   4080
  190.       TabIndex        =   2
  191.       Text            =   "10"
  192.       Top             =   5400
  193.       Width           =   855
  194.    End
  195.    Begin VB.PictureBox Pict 
  196.       AutoRedraw      =   -1  'True
  197.       Height          =   5295
  198.       Left            =   2400
  199.       ScaleHeight     =   349
  200.       ScaleMode       =   3  'Pixel
  201.       ScaleWidth      =   357
  202.       TabIndex        =   0
  203.       Top             =   0
  204.       Width           =   5415
  205.    End
  206.    Begin MSComDlg.CommonDialog LoadDialog 
  207.       Left            =   1800
  208.       Top             =   5280
  209.       _version        =   65536
  210.       _extentx        =   847
  211.       _extenty        =   847
  212.       _stockprops     =   0
  213.       cancelerror     =   -1  'True
  214.    End
  215.    Begin VB.Label Label1 
  216.       Caption         =   "Phi"
  217.       Height          =   255
  218.       Index           =   2
  219.       Left            =   6600
  220.       TabIndex        =   5
  221.       Top             =   5415
  222.       Width           =   375
  223.    End
  224.    Begin VB.Label Label1 
  225.       Caption         =   "Theta"
  226.       Height          =   255
  227.       Index           =   1
  228.       Left            =   5040
  229.       TabIndex        =   3
  230.       Top             =   5415
  231.       Width           =   495
  232.    End
  233.    Begin VB.Label Label1 
  234.       Caption         =   "R"
  235.       Height          =   255
  236.       Index           =   0
  237.       Left            =   3840
  238.       TabIndex        =   1
  239.       Top             =   5415
  240.       Width           =   255
  241.    End
  242.    Begin VB.Menu mnuFile 
  243.       Caption         =   "&File"
  244.       Begin VB.Menu mnuFileLoad 
  245.          Caption         =   "&Load..."
  246.          Shortcut        =   ^L
  247.       End
  248.       Begin VB.Menu mnuFileSaveAs 
  249.          Caption         =   "&Save As..."
  250.          Shortcut        =   ^A
  251.       End
  252.       Begin VB.Menu mnuFileSep 
  253.          Caption         =   "-"
  254.       End
  255.       Begin VB.Menu mnuFileExit 
  256.          Caption         =   "E&xit"
  257.       End
  258.    End
  259. End
  260. Attribute VB_Name = "TransformedForm"
  261. Attribute VB_Creatable = False
  262. Attribute VB_Exposed = False
  263. Option Explicit
  264.  
  265. ' Location of viewing eye.
  266. Dim EyeR As Single
  267. Dim EyeTheta As Single
  268. Dim EyePhi As Single
  269.  
  270. Const dtheta = PI / 20
  271. Const Dphi = PI / 20
  272. Const dR = 1
  273.  
  274. ' Location of focus point.
  275. Const FocusX = 0#
  276. Const FocusY = 0#
  277. Const FocusZ = 0#
  278.  
  279. Dim Projector(1 To 4, 1 To 4) As Single
  280.  
  281. Dim CurveNum As Integer
  282. Dim TransNum As Integer
  283.  
  284. Dim NumTrans As Integer
  285. Dim Trans() As Transformation
  286.  
  287. Dim ThePicture As ObjPicture
  288. Dim TheSurface As ObjTransformed
  289.  
  290. Dim ShowingParameters As Boolean
  291.  
  292. ' ************************************************
  293. ' Create the selected curve.
  294. ' ************************************************
  295. Sub CreateCurve()
  296. Dim R As Single
  297. Dim R2 As Single
  298. Dim dtheta As Single
  299. Dim theta As Single
  300. Dim y As Single
  301. Dim i As Integer
  302.  
  303.     Select Case CurveNum
  304.         Case 0  ' Line segment.
  305.             TheSurface.AddCurvePoint -2, 0, 0
  306.             TheSurface.AddCurvePoint 2, 0, 0
  307.         
  308.         Case 1  ' Square.
  309.             TheSurface.AddCurvePoint -2, 0, -2
  310.             TheSurface.AddCurvePoint -2, 0, 2
  311.             TheSurface.AddCurvePoint 2, 0, 2
  312.             TheSurface.AddCurvePoint 2, 0, -2
  313.             TheSurface.AddCurvePoint -2, 0, -2
  314.  
  315.         Case 2  ' Off Center Square.
  316.             TheSurface.AddCurvePoint 1, 0, 1
  317.             TheSurface.AddCurvePoint 1, 0, 3
  318.             TheSurface.AddCurvePoint 3, 0, 3
  319.             TheSurface.AddCurvePoint 3, 0, 1
  320.             TheSurface.AddCurvePoint 1, 0, 1
  321.  
  322.         Case 3  ' Circle.
  323.             R = 2
  324.             dtheta = PI / 8
  325.             For theta = 0 To 2 * PI - dtheta + 0.01 Step dtheta
  326.                 TheSurface.AddCurvePoint R * Cos(theta), 0, R * Sin(theta)
  327.             Next theta
  328.             TheSurface.AddCurvePoint R, 0, 0
  329.             
  330.         Case 4  ' Off Center Circle.
  331.             R = 1
  332.             dtheta = PI / 8
  333.             For theta = 0 To 2 * PI - dtheta + 0.01 Step dtheta
  334.                 TheSurface.AddCurvePoint 2 + R * Cos(theta), 0, 2 + R * Sin(theta)
  335.             Next theta
  336.             TheSurface.AddCurvePoint 2 + R, 0, 2
  337.             
  338.         Case 5  ' Star.
  339.             R = 2
  340.             R2 = 1
  341.             dtheta = 2 * PI / 5 / 2
  342.             theta = PI
  343.             For i = 1 To 5
  344.                 TheSurface.AddCurvePoint _
  345.                     R * Cos(theta), 0, R * Sin(theta)
  346.                 theta = theta + dtheta
  347.                 TheSurface.AddCurvePoint _
  348.                     R2 * Cos(theta), 0, R2 * Sin(theta)
  349.                 theta = theta + dtheta
  350.             Next i
  351.             TheSurface.AddCurvePoint _
  352.                 R * Cos(PI), 0, R * Sin(PI)
  353.             
  354.         Case 6  ' Semicircle.
  355.             R = 2
  356.             dtheta = PI / 8
  357.             For theta = 0 To PI - dtheta + 0.01 Step dtheta
  358.                 TheSurface.AddCurvePoint R * Cos(theta), 0, R * Sin(theta)
  359.             Next theta
  360.             TheSurface.AddCurvePoint -R, 0, 0
  361.         
  362.         Case Else
  363.             Beep
  364.     
  365.     End Select
  366. End Sub
  367.  
  368. ' ************************************************
  369. ' Create the array of transformations.
  370. ' ************************************************
  371. Sub CreateTransformations()
  372. Dim A(1 To 4, 1 To 4) As Single
  373. Dim B(1 To 4, 1 To 4) As Single
  374. Dim C(1 To 4, 1 To 4) As Single
  375. Dim theta As Single
  376. Dim dtheta As Single
  377. Dim R As Single
  378. Dim y As Single
  379. Dim i As Integer
  380.  
  381.     Select Case TransNum
  382.         Case 0  ' Up, twist.
  383.             NumTrans = 9
  384.             ReDim Trans(1 To NumTrans)
  385.             dtheta = PI / 12
  386.             For i = 1 To NumTrans
  387.                 y = i / 2
  388.                 theta = i * dtheta
  389.                 m3Translate A, 0, y, 0  ' Translate.
  390.                 m3YRotate B, theta      ' Rotate.
  391.                 m3MatMultiply Trans(i).M, A, B  ' Combine.
  392.             Next i
  393.             
  394.         Case 1  ' Up, shrink.
  395.             NumTrans = 9
  396.             ReDim Trans(1 To NumTrans)
  397.             For i = 1 To NumTrans
  398.                 y = i / 2
  399.                 R = (NumTrans - i) / NumTrans
  400.                 m3Scale A, R, 1, R      ' Scale.
  401.                 m3Translate B, 0, y, 0  ' Translate.
  402.                 m3MatMultiply Trans(i).M, A, B  ' Combine.
  403.             Next i
  404.             
  405.         Case 2  ' Up, shrink, twist.
  406.             NumTrans = 9
  407.             ReDim Trans(1 To NumTrans)
  408.             dtheta = PI / 12
  409.             For i = 1 To NumTrans
  410.                 y = i / 2
  411.                 R = (NumTrans - i) / NumTrans
  412.                 theta = i * dtheta
  413.                 m3Scale A, R, 1, R      ' Scale.
  414.                 m3Translate B, 0, y, 0  ' Translate.
  415.                 m3MatMultiply C, A, B   ' Combine A and B.
  416.                 m3YRotate A, theta      ' Rotate.
  417.                 m3MatMultiply Trans(i).M, C, A  ' Combine all.
  418.             Next i
  419.             
  420.         Case 3  ' Up, shrink/grow.
  421.             NumTrans = 18
  422.             ReDim Trans(1 To NumTrans)
  423.             dtheta = PI / 12
  424.             For i = 1 To NumTrans
  425.                 y = i / 4
  426.                 theta = i * dtheta
  427.                 R = 1 + Sin(2 * theta) / 2
  428.                 m3Scale A, R, 1, R      ' Scale.
  429.                 m3Translate B, 0, y, 0  ' Translate.
  430.                 m3MatMultiply Trans(i).M, A, B  ' Combine.
  431.             Next i
  432.         
  433.         Case 4  ' Waver.
  434.             ' Make the curve move upwards with
  435.             ' varying rotation around the Z axis.
  436.             NumTrans = 18
  437.             ReDim Trans(1 To NumTrans)
  438.             dtheta = PI / 12
  439.             R = PI / 2
  440.             For i = 1 To NumTrans
  441.                 y = i / 4
  442.                 theta = i * dtheta
  443.                 m3ZRotate A, R * Sin(theta)  ' Rotate.
  444.                 m3Translate B, 0, y, 0  ' Translate.
  445.                 m3MatMultiply Trans(i).M, A, B  ' Combine.
  446.             Next i
  447.         
  448.         Case Else
  449.             Beep
  450.             
  451.     End Select
  452. End Sub
  453.  
  454. Sub WaitEnd()
  455.     MousePointer = vbDefault
  456. End Sub
  457.  
  458. Sub WaitStart()
  459.     MousePointer = vbHourglass
  460.     DoEvents
  461. End Sub
  462.  
  463. ' ************************************************
  464. ' Create the surface.
  465. ' ************************************************
  466. Private Sub CmdCreate_Click()
  467. Dim pline As ObjPolyline
  468. Dim i As Integer
  469.  
  470.     WaitStart
  471.     Set ThePicture = New ObjPicture
  472.     Set TheSurface = New ObjTransformed
  473.     ThePicture.objects.Add TheSurface
  474.     
  475.     CreateCurve
  476.     CreateTransformations
  477.     
  478.     For i = 1 To NumTrans
  479.         TheSurface.SetTrans Trans(i).M
  480.     Next i
  481.     TheSurface.Transform
  482.     
  483.     If ShowAxesCheck.value = vbChecked Then
  484.         Set pline = New ObjPolyline
  485.         ThePicture.objects.Add pline
  486.         pline.AddSegment 0, 0, 0, 5, 0, 0
  487.         pline.AddSegment 0, 0, 0, 0, 5, 0
  488.         pline.AddSegment 0, 0, 0, 0, 0, 5
  489.     End If
  490.     
  491.     DrawData Pict
  492.     Pict.SetFocus
  493. End Sub
  494.  
  495. ' ************************************************
  496. ' Save the current curve choice.
  497. ' ************************************************
  498. Private Sub CurveChoice_Click(Index As Integer)
  499.     CurveNum = Index
  500. End Sub
  501.  
  502. ' *******************************************************
  503. ' Rotate the points in the cube and draw the cube.
  504. ' *******************************************************
  505. Private Sub DrawData(pic As Object)
  506. Dim x As Single
  507. Dim y As Single
  508. Dim z As Single
  509. Dim S(1 To 4, 1 To 4) As Single
  510. Dim t(1 To 4, 1 To 4) As Single
  511. Dim ST(1 To 4, 1 To 4) As Single
  512. Dim PST(1 To 4, 1 To 4) As Single
  513.  
  514.     MousePointer = vbHourglass
  515.     Refresh
  516.     
  517.     ' Prevent overflow errors when drawing lines
  518.     ' too far out of bounds.
  519.     On Error Resume Next
  520.     
  521.     ' Scale and translate so it looks OK in pixels.
  522.     m3Scale S, 35, -35, 1
  523.     m3Translate t, 180, 250, 0
  524.     m3MatMultiplyFull ST, S, t
  525.     m3MatMultiplyFull PST, Projector, ST
  526.     
  527.     ' Transform the points.
  528.     ThePicture.ApplyFull PST
  529.  
  530.     ' Display the data.
  531.     pic.Cls
  532.     ThePicture.Draw pic, EyeR
  533.     pic.Refresh
  534.  
  535.     ' Display the viewnig parameters.
  536.     ShowViewingParameters
  537.  
  538.     MousePointer = vbDefault
  539. End Sub
  540.  
  541. Sub ShowViewingParameters()
  542.     ShowingParameters = True
  543.     
  544.     RText.Text = Format$(EyeR, "0.0000")
  545.     ThetaText.Text = Format$(EyeTheta, "0.0000")
  546.     PhiText.Text = Format$(EyePhi, "0.0000")
  547.     
  548.     RText.Refresh
  549.     ThetaText.Refresh
  550.     PhiText.Refresh
  551.  
  552.     ShowingParameters = False
  553. End Sub
  554.  
  555.  
  556. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  557.     Select Case KeyCode
  558.         Case vbKeyLeft
  559.             EyeTheta = EyeTheta - dtheta
  560.         
  561.         Case vbKeyRight
  562.             EyeTheta = EyeTheta + dtheta
  563.         
  564.         Case vbKeyUp
  565.             EyePhi = EyePhi - Dphi
  566.         
  567.         Case vbKeyDown
  568.             EyePhi = EyePhi + Dphi
  569.                 
  570.         Case Else
  571.             Exit Sub
  572.     End Select
  573.  
  574.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  575.     DrawData Pict
  576. End Sub
  577.  
  578.  
  579. Private Sub Form_KeyPress(KeyAscii As Integer)
  580.     Select Case KeyAscii
  581.         Case Asc("+")
  582.             EyeR = EyeR + dR
  583.         
  584.         Case Asc("-")
  585.             EyeR = EyeR - dR
  586.         
  587.         Case Else
  588.             Exit Sub
  589.     End Select
  590.  
  591.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  592.     DrawData Pict
  593. End Sub
  594.  
  595. Private Sub Form_Load()
  596.     ' Initialize the eye position.
  597.     EyeR = 10
  598.     EyeTheta = PI * 0.2
  599.     EyePhi = PI * 0.1
  600.     
  601.     ' Initialize the projection transformation.
  602.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  603.  
  604.     Me.Show
  605.     CurveChoice_Click 0
  606. End Sub
  607.  
  608.  
  609. Private Sub mnuFileExit_Click()
  610.     Unload Me
  611. End Sub
  612.  
  613.  
  614. Private Sub mnuFileLoad_Click()
  615. Dim fname As String
  616. Dim filenum As Integer
  617. Dim txt As String
  618. Dim Xmin As Single
  619. Dim ymin As Single
  620. Dim xmax As Single
  621. Dim ymax As Single
  622. Dim i As Integer
  623.  
  624.     ' Allow the user to pick a file.
  625.     On Error Resume Next
  626.     LoadDialog.filename = "*.APF"
  627.     LoadDialog.ShowOpen
  628.     If Err.Number = cdlCancel Then
  629.         Unload LoadDialog
  630.         Exit Sub
  631.     ElseIf Err.Number <> 0 Then
  632.         Unload LoadDialog
  633.         Beep
  634.         MsgBox "Error selecting file.", , vbExclamation
  635.         Exit Sub
  636.     End If
  637.     On Error GoTo 0
  638.     
  639.     fname = LoadDialog.filename
  640.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  641.         - Len(LoadDialog.FileTitle) - 1)
  642.  
  643.     ' Clear the picture.
  644.     Set ThePicture = Nothing
  645.     
  646.     ' Open the file.
  647.     filenum = FreeFile
  648.     Open fname For Input As #filenum
  649.     
  650.     ' Make sure it's an Object Picture File.
  651.     Input #filenum, txt
  652.     If txt <> "3D APF PICTURE" Then
  653.         Close filenum
  654.         Beep
  655.         MsgBox "Error reading file """ & fname & """.", , vbExclamation
  656.         Exit Sub
  657.     End If
  658.  
  659.     ' Read the picture.
  660.     MousePointer = vbHourglass
  661.     DoEvents
  662.     Set ThePicture = New ObjPicture
  663.     ThePicture.FileInput filenum
  664.     
  665.     ' Close the file.
  666.     Close filenum
  667.  
  668.     ' Refresh the display.
  669.     DrawData Pict
  670.     
  671.     ' Deselect all the option buttons.
  672.     For i = 0 To 6
  673.         If CurveChoice(i).value Then _
  674.             CurveChoice(i).value = False
  675.     Next i
  676.     For i = 0 To 4
  677.         If TransChoice(i).value Then _
  678.             TransChoice(i).value = False
  679.     Next i
  680.     
  681.     MousePointer = vbDefault
  682. End Sub
  683.  
  684. Private Sub mnuFileSaveAs_Click()
  685. Dim fname As String
  686. Dim filenum As Integer
  687.  
  688.     ' Allow the user to pick a file.
  689.     On Error Resume Next
  690.     LoadDialog.filename = "*.APF"
  691.     LoadDialog.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  692.     LoadDialog.ShowSave
  693.     If Err.Number = cdlCancel Then
  694.         Unload LoadDialog
  695.         Exit Sub
  696.     ElseIf Err.Number <> 0 Then
  697.         Unload LoadDialog
  698.         Beep
  699.         MsgBox "Error selecting file.", , vbExclamation
  700.         Exit Sub
  701.     End If
  702.     On Error GoTo 0
  703.     
  704.     fname = LoadDialog.filename
  705.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  706.         - Len(LoadDialog.FileTitle) - 1)
  707.     
  708.     ' Open the file.
  709.     filenum = FreeFile
  710.     Open fname For Output As #filenum
  711.     
  712.     ' Write the picture.
  713.     ThePicture.FileWrite filenum
  714.     
  715.     ' Close the file.
  716.     Close filenum
  717. End Sub
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724. Private Sub PhiText_Change()
  725.     If ShowingParameters Then Exit Sub
  726.     EyePhi = CSng(PhiText.Text)
  727.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  728.     DrawData Pict
  729. End Sub
  730.  
  731. Private Sub RText_Change()
  732.     If ShowingParameters Then Exit Sub
  733.     EyeR = CSng(RText.Text)
  734.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  735.     DrawData Pict
  736. End Sub
  737.  
  738.  
  739. ' ************************************************
  740. ' Redraw with the axes on or off as appropriate.
  741. ' ************************************************
  742. Private Sub ShowAxesCheck_Click()
  743.     CmdCreate_Click
  744. End Sub
  745.  
  746. Private Sub ThetaText_Change()
  747.     If ShowingParameters Then Exit Sub
  748.     EyeTheta = CSng(ThetaText.Text)
  749.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  750.     DrawData Pict
  751. End Sub
  752.  
  753. ' ************************************************
  754. ' Save the current transformation choice.
  755. ' ************************************************
  756. Private Sub TransChoice_Click(Index As Integer)
  757.     TransNum = Index
  758. End Sub
  759.  
  760.  
  761.